package ml;

public class AnotherThread implements Runnable{
	private BusyFlag bf;
	public AnotherThread(BusyFlag _bf) { bf = _bf;};

	
	@Override
	public void run() {
		System.out.println("Calling AnotherThread - " + Thread.currentThread().getId());
		bf.getBusyFlag(100);
		try {
			//NB. ho letto il dato e settato me stesso come busyFlag...
			//però ora vado in sleep.....
			//l'altro thread richiamerà il getBusyFlag e rimarrà bloccato....
			System.out.println("Before AnotherThread SLEEP - " + Thread.currentThread().getId());
			Thread.sleep(1000);			
			System.out.println("After AnotherThread SLEEP - " + Thread.currentThread().getId());
		} catch (Exception e) {}
		
		//quando esco qui.... essendoci ancora il lock sul metodo getBusyFlag eseguito dall'altro thread...
		//anche io rimango bloccato sul synchro...
		//NB. l'altro thread rimane bloccato nel while(true)!! ... quindi non rilascia il lock sull'oggetto BusyFlag
		
		bf.freeBusyFlag();
		System.out.println("Leaving AnotherThread - " + Thread.currentThread().getId());

	}

	
}
